package com.atguigu.gmall.cart.controller;

import com.atguigu.gmall.cart.entity.CartItem;
import com.atguigu.gmall.cart.interceptor.LoginInterceptor;
import com.atguigu.gmall.cart.service.CartItemService;
import com.atguigu.gmall.cart.vo.UserInfo;
import com.atguigu.gmall.common.bean.ResponseVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.concurrent.FailureCallback;
import org.springframework.util.concurrent.ListenableFutureCallback;
import org.springframework.util.concurrent.SuccessCallback;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

@Controller
@RequestMapping("/")
public class CartController {
    @Autowired
    CartItemService cartItemService;

    @ResponseBody
    @GetMapping("test")
    public String testTask() throws ExecutionException, InterruptedException {
        System.out.println("testTask方法开始执行");
        long start = System.currentTimeMillis();
//        Future<String> f1 = cartItemService.exec1();//后面返回的结果无需使用exec1/2方法的返回结果  可以通过子任务执行
//        Future<String> f2 = cartItemService.exec2();

//        System.out.println(f1.get());//同步阻塞
//        System.out.println(f2.get());

        //异步获取异步任务的结果
//        cartItemService.exec1().addCallback(new SuccessCallback<String>() {
//            @Override
//            public void onSuccess(String s) {
//                //成功回调：子任务成功结束的回调  参数是方法返回的结果
//                System.out.println("exec1执行后的结果："+ s);
//            }
//        }, new FailureCallback() {
//            @Override
//            public void onFailure(Throwable throwable) {
//                System.out.println("exec1执行后的异常信息："+ throwable.getMessage());
//            }
//        });
//        cartItemService.exec2().addCallback(new ListenableFutureCallback<String>() {
//            @Override
//            public void onFailure(Throwable throwable) {
//                //失败回调
//                System.out.println("exec2执行后的异常信息："+ throwable.getMessage());
//            }
//
//            @Override
//            public void onSuccess(String s) {
//                //成功回调
//                System.out.println("exec2执行后的结果："+ s);
//            }
//        });

        cartItemService.exec1();
        cartItemService.exec2();

        System.out.println("testTask方法一共执行了："+(System.currentTimeMillis()-start)/1000+" s");
        return "hello,springTask";
    }
    //order服务远程访问此接口：  order服务远程访问时发起请求的请求报文是ribbon(HtpClient)来封装的
    // 报文的cookie中默认没有GMALL-TOKEN的，cart服务的LoginInterceptor就无法获取userId
    //根据userId 获取该用户已选中的购物项集合
    @ResponseBody
    @PostMapping("queryCheckedCartItemsByUserId/{userId}")
    public ResponseVo<List<CartItem>>queryCheckedCartItemsByUserId(@PathVariable("userId")Long userId){
        List<CartItem> checkedCartItems = cartItemService.queryCheckedCartItemsByUserId(userId);
        return ResponseVo.ok(checkedCartItems);
    }
    //更新购物项选中状态
    @ResponseBody
    @PostMapping("updateStatus")//{"skuId": "1517752394850238465","check": true}
    public ResponseVo<Object> updateStatus(@RequestBody CartItem cartItem){
        boolean flag = cartItemService.updateStatus(cartItem);
        return ResponseVo.ok(flag);
    }

    //删除购物项
    @ResponseBody
    @PostMapping("deleteCart")//{skuId: 1517753625693913000, count: 2}
    public ResponseVo<Object> deleteCart(@RequestParam("skuId") String skuId){
        cartItemService.deleteCart(skuId);
        return ResponseVo.ok();

    }
    //更新购物项数量
    @ResponseBody
    @PostMapping("updateNum")//{skuId: 1517753625693913000, count: 2}
    public ResponseVo<Object> updateNum(@RequestBody CartItem cartItem){
          if(cartItem.getCount()!=null && cartItem.getCount()>0 && cartItem.getCount()<=200){
            cartItemService.updateNum(cartItem);
            return ResponseVo.ok();
        }else{
            return ResponseVo.fail("数量不正确..");
        }

    }


    @GetMapping
    public String add2Cart(@RequestParam("skuId")Long skuId ,
                           @RequestParam("count")Integer count){
//        UserInfo userInfo = LoginInterceptor.getUserInfo();
//        System.out.println(userInfo);
        //添加商品到购物车
        cartItemService.add2Cart(skuId , count);
        //新增商品到购物车后 跳转到添加成功页面回显 skuId对应的购物项的详情
        return "redirect:http://cart.gmall.com/addToCart.html?skuId="+skuId;
    }
    //添加商品到购物车后的成功页面的跳转
    @GetMapping("addToCart.html")
    public String addToCartSuccess(@RequestParam("skuId")Long skuId , Model model){
        //将购物项的数据以cart作为key 购物项对象作为值 存到request域中
        CartItem cartItem = cartItemService.queryCartItemBySkuId(skuId);
        model.addAttribute("cart" , cartItem);
        //返回成功页面  在页面中回显cartItem的数据
        return "addCart";
    }


    //查询购物车数据展示
    @GetMapping("cart.html")
    public String queryCartItems(Model model){
        //调用业务方法查询所有的购物项存到request域中
        List<CartItem> cartItems = cartItemService.queryCartItems();
        model.addAttribute("carts" , cartItems);
        return "cart";
    }
}
